package cn.cloud9.designpattern.dp05proxy.proxy_02_cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @projectName: Java
 * @author: cloud9
 * @date: 2022年05月23日 13:46
 * @version: 1.0
 */
public class CglibProxyInterceptor implements MethodInterceptor {

    public <T>T getInstance(Class<T> clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return (T) enhancer.create();
    }

    private void beforeAction() {
        System.out.println("目标方法执行之前的处理");
    }

    private void afterAction() {
        System.out.println("目标方法执行之后的处理");
    }

    /**
     * 拦截的方法
     * @param target 目标对象
     * @param method 目标方法
     * @param arguments 目标方法的参数数组
     * @param methodProxy 代理包装后的方法
     * @return java.lang.Object
     * @author cloud9
     * @createTime 2022/5/23 13:46
     *
     */
    public Object intercept(
        Object target,
        Method method,
        Object[] arguments,
        MethodProxy methodProxy
    ) throws Throwable {
        this.beforeAction();
        // 不要执行源方法，会不断触发拦截器，执行递归
        // Object invoke = method.invoke(o, objects);

        // 代理实例方法执行
        Object result = methodProxy.invokeSuper(target, arguments);

        this.afterAction();

        // 把执行结果返回回去
        return result;
    }
}
